package vista.ventanas;

import javax.swing.JFrame;

import vista.objetos.FabricaRelacionGraficable;
import vista.paneles.ElementoNoExistenteException;
import vista.paneles.NingunElementoSeleccionadoException;
import vista.paneles.PanelEntidadRelacion;
import vista.paneles.PanelParLabelCombo;
import vista.paneles.PanelParLabelText;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.MouseListener;
import java.util.List;

import logica.AtributoRepetidoException;
import logica.EntidadRol;
import logica.Relacion;
import logica.RelacionException;
import logica.SinNombreException;
import logica.TipoDeRelacion;

@SuppressWarnings("serial")
public class VentanaRelacion extends SubVentanaConPanelAtributos {
	
	private PanelParLabelText panelNombre;
	private PanelParLabelCombo panelTipo;
	private PanelEntidadRelacion panelEntidades;
	
	private Relacion relacion;

	public VentanaRelacion(JFrame frame, List<FabricaRelacionGraficable> tipos) 
	{
		super(frame, "Crear Relacion", ConstantesVista.ALTO_DIALOGOS );
		
		this.panelTipo.setDatosCombo(tipos);
		
		relacion = null;
	}
	
	public VentanaRelacion(JFrame frame, List<FabricaRelacionGraficable> tipos, Relacion relacionAEditar) throws ElementoNoExistenteException 
	{
		super(frame, "Editar Relacion", ConstantesVista.ALTO_DIALOGOS );
		
		this.panelTipo.setDatosCombo(tipos);
		
		this.relacion = relacionAEditar;
		this.setInformacionRelacionAEditar();
	}

	private void setInformacionRelacionAEditar() throws ElementoNoExistenteException 
	{
		this.panelNombre.setInformacion(relacion.getNombre());
		this.panelTipo.seleccionarDato(relacion.getTipo());
		this.getPanelAtributo().agregarAtributos(relacion.getAtributos());
		this.panelEntidades.agregarEntidadesRol(relacion.getEntidades());
	}
	
	public Relacion getRelacion() throws RelacionException, SinNombreException, AtributoRepetidoException, NingunElementoSeleccionadoException
	{	
		if (relacion == null)
			relacion = new Relacion(this.panelNombre.getInformacion(), this.panelEntidades.getEntidadesRol());
		else
		{
			relacion.setNombre(this.panelNombre.getInformacion());
			relacion.setEntidadesRol(this.panelEntidades.getEntidadesRol());	
		}
		
		relacion.setAtributos(this.getAtributos());
		relacion.setTipo(TipoDeRelacion.valueOf(this.panelTipo.getDatoSeleccionado().toString().toUpperCase()));
		
		return relacion;
	}
	
	public Relacion getRelacionEditadaTemporal() throws AtributoRepetidoException, RelacionException, SinNombreException, NingunElementoSeleccionadoException
	{
		Relacion relacion = new Relacion(this.panelNombre.getInformacion(), this.panelEntidades.getEntidadesRol());
		relacion.setAtributos(this.getAtributos());
		relacion.setTipo(TipoDeRelacion.valueOf(this.panelTipo.getDatoSeleccionado().toString().toUpperCase()));
		
		return relacion;
	}
	
	public FabricaRelacionGraficable getFabricaRelacionGraficable() throws NingunElementoSeleccionadoException
	{
		try
		{
			return (FabricaRelacionGraficable)this.panelTipo.getDatoSeleccionado();
		}
		catch(NingunElementoSeleccionadoException nada)
		{//se supone q no puede pasar
			throw new NingunElementoSeleccionadoException("No se seleccionó ningún tipo de Relación");
		}
 
	}
		
	/* para eventos */
	public void agregarEntidadRol(EntidadRol entidadRol)
	{
		this.panelEntidades.agregarEntidadRol(entidadRol);
	}
	
	public void actualizarFilaEntidadRol(EntidadRol entidadRolActualizada)
	{
		this.panelEntidades.actualizarFilaEntidadRol(entidadRolActualizada);
	}
	
	public void quitarEntidadRol()
	{
		this.panelEntidades.quitarEntidadRol();
	}
	
	public EntidadRol getEntidadRolSeleccionada()
	{
		return this.panelEntidades.getEntidadRolSeleccionada();
	}
	
	public void escucharEventosAgregarEntidadRol(MouseListener controlador)
	{
		this.panelEntidades.escucharEventosBotonNuevo(controlador);
	}
	
	public void escucharEventosEditarEntidadRol(MouseListener controlador)
	{
		this.panelEntidades.escucharEventosBotonEditar(controlador);
	}
	
	public void escucharEventosEliminarEntidadRol(MouseListener controlador)
	{
		this.panelEntidades.escucharEventosBotonEliminar(controlador);
	}
	
	/* para dibujar */
	@Override
	protected void agregarComponentesPanelInformacion() 
	{
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{30, 0};
		gridBagLayout.rowHeights = new int[]{20, 20, 1, 159, 0};
		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
		
		this.getPanelDeInformacion().setLayout(gridBagLayout);
		
		agregarPanelNombre();
		agregarPanelTipo();
		agregarPanelAtributo();
		agregarPanelEntidades();		
	}

	private void agregarPanelEntidades() 
	{
		panelEntidades = new PanelEntidadRelacion();
		
		GridBagConstraints gbc_panelEntidades = new GridBagConstraints();
		gbc_panelEntidades.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelEntidades.fill = GridBagConstraints.BOTH;
		gbc_panelEntidades.gridx = 0;
		gbc_panelEntidades.gridy = 3;
		
		this.getPanelDeInformacion().add(panelEntidades, gbc_panelEntidades);
	}

	private void agregarPanelAtributo() 
	{
		GridBagConstraints gbc_panelAtributo = new GridBagConstraints();
		gbc_panelAtributo.fill = GridBagConstraints.BOTH;
		gbc_panelAtributo.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelAtributo.gridx = 0;
		gbc_panelAtributo.gridy = 2;
		
		this.getPanelDeInformacion().add(getPanelAtributo(), gbc_panelAtributo);
	}

	private void agregarPanelTipo() 
	{
		panelTipo = new PanelParLabelCombo("Tipo");
		
		GridBagConstraints gbc_panelTipo = new GridBagConstraints();
		gbc_panelTipo.fill = GridBagConstraints.HORIZONTAL;
		gbc_panelTipo.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelTipo.gridx = 0;
		gbc_panelTipo.gridy = 1;
		
		this.getPanelDeInformacion().add(panelTipo, gbc_panelTipo);
	}

	private void agregarPanelNombre() 
	{
		panelNombre = new PanelParLabelText("Nombre");
		
		GridBagConstraints gbc_panelNombre = new GridBagConstraints();
		gbc_panelNombre.fill = GridBagConstraints.HORIZONTAL;
		gbc_panelNombre.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelNombre.gridx = 0;
		gbc_panelNombre.gridy = 0;
		
		this.getPanelDeInformacion().add(panelNombre, gbc_panelNombre);
	}
}
